package com.study.common.response;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * @author chenxl
 * 响应数据工具 用于返回响应数据
 */
@SuppressWarnings("all")
public class ResponseWriter {
	private static final List EMPTY_LIST = new ArrayList(0);
    private static final Map EMPTY_MAP = new HashMap<Object, Object>(0);


    //***********************************操作成功*******************************************

    /**
     * 操作成功
     *
     * @param data 响应数据
     * @return 操作成功数据
     */
    public static String success(Object data) {
        return success(ResponseCode.SUCCESS.getMsg(), data);
    }

    /**
     * 操作成功
     *
     * @param data 响应数据
     * @return 操作成功数据
     */
    public static String success(List data) {
        return success(ResponseCode.SUCCESS.getMsg(), data);
    }

    /**
     * 操作成功
     *
     * @param msg  响应信息
     * @param data 响应数据
     * @return 操作成功数据
     */
    public static String success(String msg, Object data) {
        return toTarget(ResponseCode.SUCCESS.getCode(), msg, data);
    }

    /**
     * 操作成功
     *
     * @param msg  响应信息
     * @param data 响应数据
     * @return 操作成功数据
     */
    public static String success(String msg, List data) {
        return toTarget(ResponseCode.SUCCESS.getCode(), msg, data);
    }
    //***********************************操作失败*******************************************

    /**
     * 操作失败
     *
     * @param data 响应数据
     * @return 操作失败数据
     */
    public static String failed(Object data) {
        return failed(ResponseCode.FAILED.getMsg(), data);
    }

    /**
     * 操作失败
     *
     * @param data 响应数据
     * @return 操作失败数据
     */
    public static String failed(List data) {
        return failed(ResponseCode.FAILED.getMsg(), data);
    }

    /**
     * 操作失败
     *
     * @param msg  响应信息
     * @param data 响应数据
     * @return 操作失败数据
     */
    public static String failed(String msg, Object data) {
        return toTarget(ResponseCode.FAILED.getCode(), msg, data);
    }

    /**
     * 操作失败
     *
     * @param msg  响应信息
     * @param data 响应数据
     * @return 操作失败数据
     */
    public static String failed(String msg, List data) {
        return toTarget(ResponseCode.FAILED.getCode(), msg, data);
    }
    //***********************************操作异常*******************************************

    /**
     * 操作异常
     *
     * @param data 响应数据
     * @return 操作异常数据
     */
    public static String execption(Object data) {
        return execption(ResponseCode.EXECPTION.getMsg(), data);
    }

    /**
     * 操作异常
     *
     * @param data 响应数据
     * @return 操作异常数据
     */
    public static String execption(List data) {
        return execption(ResponseCode.EXECPTION.getMsg(), data);
    }

    /**
     * 操作异常
     *
     * @param msg  响应信息
     * @param data 响应数据
     * @return 操作异常数据
     */
    public static String execption(String msg, Object data) {
        return toTarget(ResponseCode.EXECPTION.getCode(), msg, data);
    }

    /**
     * 操作异常
     *
     * @param msg  响应信息
     * @param data 响应数据
     * @return 操作异常数据
     */
    public static String execption(String msg, List data) {
        return toTarget(ResponseCode.EXECPTION.getCode(), msg, data);
    }
    //***********************************缺少认证*******************************************

    /**
     * 缺少认证
     *
     * @return 缺少认证数据
     */
    public static String noAuth() {
        return toTarget(ResponseCode.NOAUTH.getCode(), ResponseCode.NOAUTH.getMsg(), EMPTY_MAP);
    }

    //***********************************缺少认证*******************************************

    /**
     * 认证失败
     *
     * @return 认证失败数据
     */
    public static String authError() {
        return toTarget(ResponseCode.AUTHERROR.getCode(), ResponseCode.AUTHERROR.getMsg(), EMPTY_MAP);
    }

    //***********************************数据拼装*******************************************

    /**
     * 拼装 生成json数据
     *
     * @param code 响应码
     * @param msg  响应信息
     * @param data 响应数据
     * @return json响应数据
     */
    private static String toTarget(String code, String msg, Object data) {
        Object d;
        if (data == null) {
            d = EMPTY_MAP;
        } else {
            d = data;
        }
        ResponseEntity res = new ResponseEntity(code, msg, d);
        return JSONObject.toJSONString(res, SerializerFeature.WriteMapNullValue);
    }

    /**
     * 拼装 生成json数据
     *
     * @param code 响应码
     * @param msg  响应信息
     * @param data 响应数据
     * @return json响应数据
     */
    private static String toTarget(String code, String msg, List data) {
        Object d;
        if (data == null) {
            d = EMPTY_LIST;
        } else {
            d = data;
        }
        ResponseEntity res = new ResponseEntity(code, msg, d);
        return JSONObject.toJSONString(res, SerializerFeature.WriteMapNullValue);
    }
}
